package com.sudoctor.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;

import com.sudoctor.bean.BusquedaAvanzadaBean;
import com.sudoctor.bean.BusquedaGeolocalizacionBean;
import com.sudoctor.bean.BusquedaSencillaBean;
import com.sudoctor.dao.InmuebleDAO;
import com.sudoctor.entity.AreaInmueble;
import com.sudoctor.entity.CorreoElectronico;
import com.sudoctor.entity.Dia;
import com.sudoctor.entity.Especialidad;
import com.sudoctor.entity.Estado;
import com.sudoctor.entity.HorarioInmueble;
import com.sudoctor.entity.Inmueble;
import com.sudoctor.entity.ServicioInmueble;
import com.sudoctor.entity.UnidadNegocio;
import com.sudoctor.entity.Municipio;
import com.sudoctor.entity.PaginaWeb;
import com.sudoctor.entity.Telefono;
import com.sudoctor.entity.TipoInmueble;

public class InmuebleDaoImpl extends GenericDaoImpl<Inmueble> implements InmuebleDAO<Inmueble>
{

	@Override
	public List<Inmueble> obtenerListaConsultorios(BusquedaSencillaBean objBusquedaSencillaBean,final int offset, int resultadosPorPagina)
	{
		final int tipoServicio = objBusquedaSencillaBean.getTipoServicio();
		
		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT inm_id,itijoin.uni_id,itijoin.uni_tipoinmuebleid ,uni_descripcion,uni_razonsocial,uni_rfc,inm_calle,inm_numeroexterior,inm_numerointerior,inm_referenciaubicacion,inm_referenciaubicacion2,inm_numerolocal,inm_estadoid,estados.est_descripcion,inm_municipioid,municipios.mun_descripcion,inm_codigopostal,inm_coloniadesc,inm_latitud,inm_longitud,uni_zoom,uni_tiposector,uni_giroid, paginaweb.pwe_descripcion, correoelectronico.cel_id , correoelectronico.cel_descripcion, telefonos.tel_id, telefonos.tel_telefono, telefonos.tel_lada,inm_banderaalta,inm_estatus,inm_fecalt,inm_fecact,inm_usualt,inm_fecmod,inm_usumod, uni_acercade, uni_verificado ");
		sb.append(" , especialidadinmueble.ein_especialidadid, especialidades.esp_descripcion ");
		sb.append(" , itijoin.uni_principal , itijoin.uni_tipoinmuebleid , itijoin.uni_emergencia , itijoin.uni_urgencia , itijoin.uni_24h, itijoin.uni_domicilio, itijoin.uni_formapago, itijoin.uni_promocionvigente ");
		sb.append(" FROM inmuebles ");
		
		sb.append(" RIGHT JOIN  (select prin.uni_id, prin.uni_principal ,prin.uni_inmuebleid, prin.uni_tipoinmuebleid, prin.uni_emergencia, prin.uni_urgencia, prin.uni_24h, prin.uni_domicilio, prin.uni_formapago, prin.uni_promocionvigente, prin.uni_descripcion, prin.uni_razonsocial, prin.uni_rfc, prin.uni_zoom, prin.uni_tiposector, prin.uni_giroid, prin.uni_autocomplete,prin.uni_acercade,prin.uni_franquicia,prin.uni_verificado FROM unidadnegocio as prin ");
		sb.append(" inner join (");
		sb.append(" select uni_inmuebleid FROM unidadnegocio where uni_tipoinmuebleid = ? ");
		sb.append(" ) as sec on prin.uni_inmuebleid = sec.uni_inmuebleid ");
		sb.append(" inner join inmuebles as inmb ");
		sb.append(" on (prin.uni_inmuebleid = inmb.inm_id and inmb.inm_estadoid = ? and inmb.inm_municipioid = ? and prin.uni_descripcion LIKE ? ) ");
		sb.append(" limit ? offset ? ");
		sb.append(" ) AS itijoin  ON inmuebles.inm_id = itijoin.uni_inmuebleid ");
		
		sb.append(" INNER JOIN ");
		sb.append(" estados ");
		sb.append(" ON inmuebles.inm_estadoid = estados.est_id ");
		sb.append(" INNER JOIN ");
		sb.append(" municipios ");
		sb.append(" ON municipios.mun_estadoid = inmuebles.inm_estadoid AND inmuebles.inm_municipioid = municipios.mun_idmunicipioSepomex ");
		
		sb.append(" LEFT JOIN especialidadinmueble ");
		sb.append(" ON especialidadinmueble.ein_unidadnegocioid = inmuebles.inm_id ");
		sb.append(" LEFT JOIN especialidades ");
		sb.append(" ON especialidades.esp_id = especialidadinmueble.ein_especialidadid ");
		
		sb.append(" LEFT JOIN telefonos ");
		sb.append(" ON telefonos.tel_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN paginaweb ");
		sb.append(" ON paginaweb.pwe_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN correoelectronico ");
		sb.append(" ON correoelectronico.cel_unidadnegocioid = inmuebles.inm_id ");
		
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			objBusquedaSencillaBean.getTipoServicio(), 
			objBusquedaSencillaBean.getIdEstado(),
			objBusquedaSencillaBean.getIdMunicipio()
			,"%"+objBusquedaSencillaBean.getDescripcion()+"%"
			, resultadosPorPagina
			, offset//offset
		},
				new ResultSetExtractor<List<Inmueble>>(){  
		    @Override  
		     public List<Inmueble> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	Map<Long, Inmueble> mapInmuebles = new LinkedHashMap<Long, Inmueble>();
		    	Map<Long, Telefono> mapTelefono = new LinkedHashMap<Long, Telefono>();
		    	Map<Long, CorreoElectronico> mapCorreo = new LinkedHashMap<Long, CorreoElectronico>();
		    	
		    	int pagina = (1 * ((offset/10) + 1));

		    	int	indice = ( ( pagina - 1 ) * 10 ) + 1;
 
		        while(rs.next()){
		        	Long id = rs.getLong("inm_id");
		        	Inmueble objInmueble = mapInmuebles.get(id);
		        	
		        	if(objInmueble == null)
		        	{
		        		objInmueble = new Inmueble();
		        		objInmueble.setIndice(indice);
		        		
		        		Estado objEstado = new Estado();
						objEstado.setEst_id(rs.getInt("inm_estadoid"));
						objEstado.setEst_descripcion(rs.getString("estados.est_descripcion"));
		
						Municipio objMunicipio = new Municipio();
						objMunicipio.setMun_id(rs.getInt("inm_municipioid"));
						objMunicipio.setMun_descripcion(rs.getString("municipios.mun_descripcion"));
						objMunicipio.setObjEstado(objEstado);
						
						UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			PaginaWeb objPaginaWeb = new PaginaWeb();
	        			objPaginaWeb.setDescripcion(rs.getString("paginaweb.pwe_descripcion"));
	        			objInmueble.setObjPaginaWeb(objPaginaWeb);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
	        			obj.setDomicilio(rs.getBoolean("uni_domicilio"));
	        			
	        			//Llenar datos de forma de pago y vigencia de promocion
	        			obj.setFormaPago(rs.getInt("uni_formapago"));
	        			obj.setPromocionVigente(rs.getBoolean("uni_promocionvigente"));
						obj.setDescripcion(rs.getString("uni_descripcion"));
						obj.setRazonSocial(rs.getString("uni_razonsocial"));
						obj.setRfc(rs.getString("uni_rfc"));
						obj.setZoom(rs.getString("uni_zoom"));
						obj.setTipoSector(rs.getString("uni_tiposector"));
						obj.setGiroId(rs.getString("uni_giroid"));
						obj.setAcercaDe(rs.getString("uni_acercade"));
						obj.setVerificado(rs.getBoolean("uni_verificado"));
	        			
	        			objInmueble.setObjUnidadNegocio(obj);

						objInmueble.setId(rs.getInt("inm_id"));
		
						objInmueble.setCalle(rs.getString("inm_calle"));
						objInmueble.setNumeroExterior(rs.getString("inm_numeroexterior"));
						objInmueble.setNumeroInterior(rs.getString("inm_numerointerior"));
						objInmueble.setReferenciaUbicacion(rs.getString("inm_referenciaubicacion"));
						objInmueble.setReferenciaUbicacion2(rs.getString("inm_referenciaubicacion2"));
						objInmueble.setNumeroLocal(rs.getString("inm_numerolocal"));
		
						objInmueble.getEstado().setEst_id(objEstado.getEst_id());
						objInmueble.getEstado().setEst_descripcion(objEstado.getEst_descripcion());
		
						objInmueble.getMunicipio().setMun_id(objMunicipio.getMun_id());
						objInmueble.getMunicipio().setMun_descripcion(objMunicipio.getMun_descripcion());
		
						objInmueble.setCodigoPostal(rs.getString("inm_codigopostal"));
						objInmueble.setColoniaDescripcion(rs.getString("inm_coloniadesc"));
						objInmueble.setLatitud(rs.getString("inm_latitud"));
						objInmueble.setLongitud(rs.getString("inm_longitud"));


						objInmueble.setBanderaAlta(rs.getInt("inm_banderaalta"));

						objInmueble.setEstatus(rs.getInt("inm_estatus"));
						objInmueble.setFecAlt(rs.getString("inm_fecalt"));
						objInmueble.setFecAct(rs.getString("inm_fecact"));
						objInmueble.setUsuAlt(rs.getInt("inm_usualt"));
						objInmueble.setFecMod(rs.getString("inm_fecmod"));
						objInmueble.setUsuMod(rs.getInt("inm_usumod"));

						
						//Se agrega al map
						mapInmuebles.put(id, objInmueble);
						
						indice++;
		        		
		        	}
		        		
	        		if(tipoServicio != rs.getInt("uni_tipoinmuebleid"))
		        	{//Si es un tipo inmueble diferente al buscado, se agrega a la lista.
	        			UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
		        		objInmueble.getLstInmuebleTipoInmueble().add(obj);
		        	}else{
		        		//El registro pertenece a la misma unidad de negocio
		        		
		        		//Condicion, ya que actualmente no tenemos ningun inmueble con especialidades
			        	if(rs.getInt("especialidadinmueble.ein_especialidadid") != 0)
			        	{
			        		Especialidad objEspecialidad = new Especialidad();
							objEspecialidad.setId(rs.getInt("especialidadinmueble.ein_especialidadid"));
							objEspecialidad.setNombre(rs.getString("especialidades.esp_descripcion"));
				        	
				        	objInmueble.getLstEspecialidades().add(objEspecialidad);
			        	}
			        	
			        	Long idTelefono = rs.getLong("telefonos.tel_id");
			        	Telefono objTelefono = mapTelefono.get(idTelefono);
			        	
			        	if(objTelefono == null)
			        	{//No existe en lista de telefonos
			        		Telefono objTelefonoLocal = new Telefono();
			        		objTelefonoLocal.setId(rs.getInt("telefonos.tel_id"));
			        		objTelefonoLocal.setTelefono(rs.getString("telefonos.tel_telefono"));
			        		objTelefonoLocal.setLada(rs.getString("telefonos.tel_lada"));
			        		mapTelefono.put(idTelefono, objTelefonoLocal);//Se agrega al map.
			        		objInmueble.getLstTelefono().add(objTelefonoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
			        	
			        	Long idCorreo = rs.getLong("correoelectronico.cel_id");
			        	CorreoElectronico objCorreo = mapCorreo.get(idCorreo);
			        	
			        	if(objCorreo == null)
			        	{//No existe en lista de correos
			        		CorreoElectronico objCorreoElectronicoLocal = new CorreoElectronico();
			        		objCorreoElectronicoLocal.setId(rs.getInt("correoelectronico.cel_id"));
			        		objCorreoElectronicoLocal.setDescripcion(rs.getString("correoelectronico.cel_descripcion"));
			        		mapCorreo.put(idTelefono, objCorreoElectronicoLocal);//Se agrega al map.
			        		objInmueble.getLstCorreoElectronico().add(objCorreoElectronicoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
			        	
			        	
		        		
		        	}
		        		

		        }
		        	return new ArrayList<Inmueble>(mapInmuebles.values()); 
		        }  
		    });
		
	}

	@Override
	public List<Inmueble> obtenerListaFarmacias(BusquedaSencillaBean objBusquedaSencillaBean,final int offset, int resultadosPorPagina)
	{
		final int tipoServicio = objBusquedaSencillaBean.getTipoServicio();
		
		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT inm_id,itijoin.uni_id,itijoin.uni_tipoinmuebleid ,uni_descripcion,uni_razonsocial,uni_rfc,inm_calle,inm_numeroexterior,inm_numerointerior,inm_referenciaubicacion,inm_referenciaubicacion2,inm_numerolocal,inm_estadoid,estados.est_descripcion,inm_municipioid,municipios.mun_descripcion,inm_codigopostal,inm_coloniadesc,inm_latitud,inm_longitud,uni_zoom,uni_tiposector,uni_giroid, paginaweb.pwe_descripcion, correoelectronico.cel_id , correoelectronico.cel_descripcion, telefonos.tel_id, telefonos.tel_telefono, telefonos.tel_lada,inm_banderaalta,inm_estatus,inm_fecalt,inm_fecact,inm_usualt,inm_fecmod,inm_usumod, uni_acercade , uni_verificado ");
		sb.append(" , itijoin.uni_principal , itijoin.uni_tipoinmuebleid , itijoin.uni_emergencia , itijoin.uni_urgencia , itijoin.uni_24h, itijoin.uni_domicilio, itijoin.uni_formapago, itijoin.uni_promocionvigente   ");
		sb.append(" FROM inmuebles ");
		
		sb.append(" RIGHT JOIN  (select prin.uni_id, prin.uni_principal ,prin.uni_inmuebleid, prin.uni_tipoinmuebleid, prin.uni_emergencia, prin.uni_urgencia, prin.uni_24h, prin.uni_domicilio, prin.uni_formapago, prin.uni_promocionvigente, prin.uni_descripcion, prin.uni_razonsocial, prin.uni_rfc, prin.uni_zoom, prin.uni_tiposector, prin.uni_giroid, prin.uni_autocomplete,prin.uni_acercade,prin.uni_franquicia,prin.uni_verificado   FROM unidadnegocio as prin ");
		sb.append(" inner join (");
		sb.append(" select uni_inmuebleid FROM unidadnegocio where uni_tipoinmuebleid = ? ");
		sb.append(" ) as sec on prin.uni_inmuebleid = sec.uni_inmuebleid ");
		sb.append(" inner join inmuebles as inmb ");
		sb.append(" on (prin.uni_inmuebleid = inmb.inm_id and inmb.inm_estadoid = ? and inmb.inm_municipioid = ? and prin.uni_descripcion LIKE ? ) ");
		sb.append(" limit ? offset ? ");
		sb.append(" ) AS itijoin  ON inmuebles.inm_id = itijoin.uni_inmuebleid ");
		
		sb.append(" INNER JOIN ");
		sb.append(" estados ");
		sb.append(" ON inmuebles.inm_estadoid = estados.est_id ");
		sb.append(" INNER JOIN ");
		sb.append(" municipios ");
		sb.append(" ON municipios.mun_estadoid = inmuebles.inm_estadoid AND inmuebles.inm_municipioid = municipios.mun_idmunicipioSepomex ");
		
		sb.append(" LEFT JOIN telefonos ");
		sb.append(" ON telefonos.tel_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN paginaweb ");
		sb.append(" ON paginaweb.pwe_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN correoelectronico ");
		sb.append(" ON correoelectronico.cel_unidadnegocioid = inmuebles.inm_id ");

		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			objBusquedaSencillaBean.getTipoServicio(), 
			objBusquedaSencillaBean.getIdEstado(),
			objBusquedaSencillaBean.getIdMunicipio()
			,"%"+objBusquedaSencillaBean.getDescripcion()+"%"
			, resultadosPorPagina
			, offset
		},
				new ResultSetExtractor<List<Inmueble>>(){  
		    @Override  
		     public List<Inmueble> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	Map<Long, Inmueble> mapInmuebles = new LinkedHashMap<Long, Inmueble>();
		    	Map<Long, Telefono> mapTelefono = new LinkedHashMap<Long, Telefono>();
		    	Map<Long, CorreoElectronico> mapCorreo = new LinkedHashMap<Long, CorreoElectronico>();
		    	
		    	int pagina = (1 * ((offset/10) + 1));

		    	int	indice = ( ( pagina - 1 ) * 10 ) + 1;
		    	 
		        while(rs.next()){
		        	Long id = rs.getLong("inm_id");
		        	Inmueble objInmueble = mapInmuebles.get(id);
		        	
		        	if(objInmueble == null)
		        	{
		        		objInmueble = new Inmueble();
		        		objInmueble.setIndice(indice);
		        		
		        		Estado objEstado = new Estado();
						objEstado.setEst_id(rs.getInt("inm_estadoid"));
						objEstado.setEst_descripcion(rs.getString("estados.est_descripcion"));
		
						Municipio objMunicipio = new Municipio();
						objMunicipio.setMun_id(rs.getInt("inm_municipioid"));
						objMunicipio.setMun_descripcion(rs.getString("municipios.mun_descripcion"));
						objMunicipio.setObjEstado(objEstado);
						
						UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
	        			obj.setDomicilio(rs.getBoolean("uni_domicilio"));
	        			
	        			//Llenar datos de forma de pago y vigencia de promocion
	        			obj.setFormaPago(rs.getInt("uni_formapago"));
	        			obj.setPromocionVigente(rs.getBoolean("uni_promocionvigente"));
						obj.setDescripcion(rs.getString("uni_descripcion"));
						obj.setRazonSocial(rs.getString("uni_razonsocial"));
						obj.setRfc(rs.getString("uni_rfc"));
						obj.setZoom(rs.getString("uni_zoom"));
						obj.setTipoSector(rs.getString("uni_tiposector"));
						obj.setGiroId(rs.getString("uni_giroid"));
						obj.setAcercaDe(rs.getString("uni_acercade"));
						obj.setVerificado(rs.getBoolean("uni_verificado"));
	        			
	        			objInmueble.setObjUnidadNegocio(obj);
		
						objInmueble.setId(rs.getInt("inm_id"));
		
						objInmueble.setCalle(rs.getString("inm_calle"));
						objInmueble.setNumeroExterior(rs.getString("inm_numeroexterior"));
						objInmueble.setNumeroInterior(rs.getString("inm_numerointerior"));
						objInmueble.setReferenciaUbicacion(rs.getString("inm_referenciaubicacion"));
						objInmueble.setReferenciaUbicacion2(rs.getString("inm_referenciaubicacion2"));
						objInmueble.setNumeroLocal(rs.getString("inm_numerolocal"));
		
						objInmueble.getEstado().setEst_id(objEstado.getEst_id());
						objInmueble.getEstado().setEst_descripcion(objEstado.getEst_descripcion());
		
						objInmueble.getMunicipio().setMun_id(objMunicipio.getMun_id());
						objInmueble.getMunicipio().setMun_descripcion(objMunicipio.getMun_descripcion());
						
						PaginaWeb objPaginaWeb = new PaginaWeb();
	        			objPaginaWeb.setDescripcion(rs.getString("paginaweb.pwe_descripcion"));
	        			objInmueble.setObjPaginaWeb(objPaginaWeb);
		
						objInmueble.setCodigoPostal(rs.getString("inm_codigopostal"));
						objInmueble.setColoniaDescripcion(rs.getString("inm_coloniadesc"));
						objInmueble.setLatitud(rs.getString("inm_latitud"));
						objInmueble.setLongitud(rs.getString("inm_longitud"));

						objInmueble.setBanderaAlta(rs.getInt("inm_banderaalta"));

						objInmueble.setEstatus(rs.getInt("inm_estatus"));
						objInmueble.setFecAlt(rs.getString("inm_fecalt"));
						objInmueble.setFecAct(rs.getString("inm_fecact"));
						objInmueble.setUsuAlt(rs.getInt("inm_usualt"));
						objInmueble.setFecMod(rs.getString("inm_fecmod"));
						objInmueble.setUsuMod(rs.getInt("inm_usumod"));

						//Se agrega al map
						mapInmuebles.put(id, objInmueble);
						
						indice++;
		        		
		        	}
		        	
		        	if(tipoServicio != rs.getInt("uni_tipoinmuebleid"))
		        	{//Si es un tipo inmueble diferente al buscado, se agrega a la lista.
	        			UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
		        		objInmueble.getLstInmuebleTipoInmueble().add(obj);
		        	}else{
		        		//El registro pertenece a la misma unidad de negocio
			        	
			        	Long idTelefono = rs.getLong("telefonos.tel_id");
			        	Telefono objTelefono = mapTelefono.get(idTelefono);
			        	
			        	if(objTelefono == null)
			        	{//No existe en lista de telefonos
			        		Telefono objTelefonoLocal = new Telefono();
			        		objTelefonoLocal.setId(rs.getInt("telefonos.tel_id"));
			        		objTelefonoLocal.setTelefono(rs.getString("telefonos.tel_telefono"));
			        		objTelefonoLocal.setLada(rs.getString("telefonos.tel_lada"));
			        		mapTelefono.put(idTelefono, objTelefonoLocal);//Se agrega al map.
			        		objInmueble.getLstTelefono().add(objTelefonoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
			        	
			        	Long idCorreo = rs.getLong("correoelectronico.cel_id");
			        	CorreoElectronico objCorreo = mapCorreo.get(idCorreo);
			        	
			        	if(objCorreo == null)
			        	{//No existe en lista de correos
			        		CorreoElectronico objCorreoElectronicoLocal = new CorreoElectronico();
			        		objCorreoElectronicoLocal.setId(rs.getInt("correoelectronico.cel_id"));
			        		objCorreoElectronicoLocal.setDescripcion(rs.getString("correoelectronico.cel_descripcion"));
			        		mapCorreo.put(idTelefono, objCorreoElectronicoLocal);//Se agrega al map.
			        		objInmueble.getLstCorreoElectronico().add(objCorreoElectronicoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
		        		
		        	
		        		
		        	}
		        	
		        }
		        	return new ArrayList<Inmueble>(mapInmuebles.values()); 
		        }  
		    });

	}

	@Override
	public List<Inmueble> obtenerListaLaboratorios(BusquedaSencillaBean objBusquedaSencillaBean,final int offset, int resultadosPorPagina)
	{
		StringBuffer sb = new StringBuffer();
		
		final int tipoServicio = objBusquedaSencillaBean.getTipoServicio();
		
		sb.append(" SELECT inm_id,itijoin.uni_id,itijoin.uni_tipoinmuebleid ,uni_descripcion,uni_razonsocial,uni_rfc,inm_calle,inm_numeroexterior,inm_numerointerior,inm_referenciaubicacion,inm_referenciaubicacion2,inm_numerolocal,inm_estadoid,estados.est_descripcion,inm_municipioid,municipios.mun_descripcion,inm_codigopostal,inm_coloniadesc,inm_latitud,inm_longitud,uni_zoom,uni_tiposector,uni_giroid, paginaweb.pwe_descripcion, correoelectronico.cel_id , correoelectronico.cel_descripcion, telefonos.tel_id, telefonos.tel_telefono, telefonos.tel_lada,inm_banderaalta,inm_estatus,inm_fecalt,inm_fecact,inm_usualt,inm_fecmod,inm_usumod, uni_acercade , uni_verificado ");
		sb.append(" , itijoin.uni_principal , itijoin.uni_tipoinmuebleid , itijoin.uni_emergencia , itijoin.uni_urgencia , itijoin.uni_24h, itijoin.uni_domicilio, itijoin.uni_formapago, itijoin.uni_promocionvigente   ");
		sb.append(" FROM inmuebles ");
		
		sb.append(" RIGHT JOIN  (select prin.uni_id, prin.uni_principal ,prin.uni_inmuebleid, prin.uni_tipoinmuebleid, prin.uni_emergencia, prin.uni_urgencia, prin.uni_24h, prin.uni_domicilio, prin.uni_formapago, prin.uni_promocionvigente, prin.uni_descripcion, prin.uni_razonsocial, prin.uni_rfc, prin.uni_zoom, prin.uni_tiposector, prin.uni_giroid, prin.uni_autocomplete,prin.uni_acercade,prin.uni_franquicia,prin.uni_verificado   FROM unidadnegocio as prin ");
		sb.append(" inner join (");
		sb.append(" select uni_inmuebleid FROM unidadnegocio where uni_tipoinmuebleid = ? ");
		sb.append(" ) as sec on prin.uni_inmuebleid = sec.uni_inmuebleid ");
		sb.append(" inner join inmuebles as inmb ");
		sb.append(" on (prin.uni_inmuebleid = inmb.inm_id and inmb.inm_estadoid = ? and inmb.inm_municipioid = ? and prin.uni_descripcion LIKE ? ) ");
		sb.append(" limit ? offset ? ");
		sb.append(" ) AS itijoin  ON inmuebles.inm_id = itijoin.uni_inmuebleid ");
		
		sb.append(" INNER JOIN ");
		sb.append(" estados ");
		sb.append(" ON inmuebles.inm_estadoid = estados.est_id ");
		sb.append(" INNER JOIN ");
		sb.append(" municipios ");
		sb.append(" ON municipios.mun_estadoid = inmuebles.inm_estadoid AND inmuebles.inm_municipioid = municipios.mun_idmunicipioSepomex ");
		
		sb.append(" LEFT JOIN telefonos ");
		sb.append(" ON telefonos.tel_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN paginaweb ");
		sb.append(" ON paginaweb.pwe_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN correoelectronico ");
		sb.append(" ON correoelectronico.cel_unidadnegocioid = inmuebles.inm_id ");
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			objBusquedaSencillaBean.getTipoServicio(), 
			objBusquedaSencillaBean.getIdEstado(),
			objBusquedaSencillaBean.getIdMunicipio()
			,"%"+objBusquedaSencillaBean.getDescripcion()+"%"
			, resultadosPorPagina
			, offset
		},
				new ResultSetExtractor<List<Inmueble>>(){  
		    @Override  
		     public List<Inmueble> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	Map<Long, Inmueble> mapInmuebles = new LinkedHashMap<Long, Inmueble>();
		    	Map<Long, Telefono> mapTelefono = new LinkedHashMap<Long, Telefono>();
		    	Map<Long, CorreoElectronico> mapCorreo = new LinkedHashMap<Long, CorreoElectronico>();
		    	
		    	int pagina = (1 * ((offset/10) + 1));

		    	int	indice = ( ( pagina - 1 ) * 10 ) + 1;
		    	 
		        while(rs.next()){
		        	Long id = rs.getLong("inm_id");
		        	Inmueble objInmueble = mapInmuebles.get(id);
		        	
		        	if(objInmueble == null)
		        	{
		        		objInmueble = new Inmueble();
		        		objInmueble.setIndice(indice);
		        		
		        		Estado objEstado = new Estado();
						objEstado.setEst_id(rs.getInt("inm_estadoid"));
						objEstado.setEst_descripcion(rs.getString("estados.est_descripcion"));
		
						Municipio objMunicipio = new Municipio();
						objMunicipio.setMun_id(rs.getInt("inm_municipioid"));
						objMunicipio.setMun_descripcion(rs.getString("municipios.mun_descripcion"));
						objMunicipio.setObjEstado(objEstado);
						
						UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
	        			obj.setDomicilio(rs.getBoolean("uni_domicilio"));
	        			
	        			//Llenar datos de forma de pago y vigencia de promocion
	        			obj.setFormaPago(rs.getInt("uni_formapago"));
	        			obj.setPromocionVigente(rs.getBoolean("uni_promocionvigente"));
						obj.setDescripcion(rs.getString("uni_descripcion"));
						obj.setRazonSocial(rs.getString("uni_razonsocial"));
						obj.setRfc(rs.getString("uni_rfc"));
						obj.setZoom(rs.getString("uni_zoom"));
						obj.setTipoSector(rs.getString("uni_tiposector"));
						obj.setGiroId(rs.getString("uni_giroid"));
						obj.setAcercaDe(rs.getString("uni_acercade"));
						obj.setVerificado(rs.getBoolean("uni_verificado"));
	        			
	        			objInmueble.setObjUnidadNegocio(obj);
		
						objInmueble.setId(rs.getInt("inm_id"));
		
						objInmueble.setCalle(rs.getString("inm_calle"));
						objInmueble.setNumeroExterior(rs.getString("inm_numeroexterior"));
						objInmueble.setNumeroInterior(rs.getString("inm_numerointerior"));
						objInmueble.setReferenciaUbicacion(rs.getString("inm_referenciaubicacion"));
						objInmueble.setReferenciaUbicacion2(rs.getString("inm_referenciaubicacion2"));
						objInmueble.setNumeroLocal(rs.getString("inm_numerolocal"));
		
						objInmueble.getEstado().setEst_id(objEstado.getEst_id());
						objInmueble.getEstado().setEst_descripcion(objEstado.getEst_descripcion());
		
						objInmueble.getMunicipio().setMun_id(objMunicipio.getMun_id());
						objInmueble.getMunicipio().setMun_descripcion(objMunicipio.getMun_descripcion());
						
						PaginaWeb objPaginaWeb = new PaginaWeb();
	        			objPaginaWeb.setDescripcion(rs.getString("paginaweb.pwe_descripcion"));
	        			objInmueble.setObjPaginaWeb(objPaginaWeb);
		
						objInmueble.setCodigoPostal(rs.getString("inm_codigopostal"));
						objInmueble.setColoniaDescripcion(rs.getString("inm_coloniadesc"));
						objInmueble.setLatitud(rs.getString("inm_latitud"));
						objInmueble.setLongitud(rs.getString("inm_longitud"));

						objInmueble.setBanderaAlta(rs.getInt("inm_banderaalta"));

						objInmueble.setEstatus(rs.getInt("inm_estatus"));
						objInmueble.setFecAlt(rs.getString("inm_fecalt"));
						objInmueble.setFecAct(rs.getString("inm_fecact"));
						objInmueble.setUsuAlt(rs.getInt("inm_usualt"));
						objInmueble.setFecMod(rs.getString("inm_fecmod"));
						objInmueble.setUsuMod(rs.getInt("inm_usumod"));
						
						//Se agrega al map
						mapInmuebles.put(id, objInmueble);
						
						indice++;
		        		
		        	}
		        	
		        	if(tipoServicio != rs.getInt("uni_tipoinmuebleid"))
		        	{//Si es un tipo inmueble diferente al buscado, se agrega a la lista.
	        			UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
		        		objInmueble.getLstInmuebleTipoInmueble().add(obj);
		        	}else{
		        		//El registro pertenece a la misma unidad de negocio
			        	
			        	Long idTelefono = rs.getLong("telefonos.tel_id");
			        	Telefono objTelefono = mapTelefono.get(idTelefono);
			        	
			        	if(objTelefono == null)
			        	{//No existe en lista de telefonos
			        		Telefono objTelefonoLocal = new Telefono();
			        		objTelefonoLocal.setId(rs.getInt("telefonos.tel_id"));
			        		objTelefonoLocal.setTelefono(rs.getString("telefonos.tel_telefono"));
			        		objTelefonoLocal.setLada(rs.getString("telefonos.tel_lada"));
			        		mapTelefono.put(idTelefono, objTelefonoLocal);//Se agrega al map.
			        		objInmueble.getLstTelefono().add(objTelefonoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
			        	
			        	Long idCorreo = rs.getLong("correoelectronico.cel_id");
			        	CorreoElectronico objCorreo = mapCorreo.get(idCorreo);
			        	
			        	if(objCorreo == null)
			        	{//No existe en lista de correos
			        		CorreoElectronico objCorreoElectronicoLocal = new CorreoElectronico();
			        		objCorreoElectronicoLocal.setId(rs.getInt("correoelectronico.cel_id"));
			        		objCorreoElectronicoLocal.setDescripcion(rs.getString("correoelectronico.cel_descripcion"));
			        		mapCorreo.put(idTelefono, objCorreoElectronicoLocal);//Se agrega al map.
			        		objInmueble.getLstCorreoElectronico().add(objCorreoElectronicoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
		        		
		        	
		        	}
		        	
		        	
		        }
		        	return new ArrayList<Inmueble>(mapInmuebles.values()); 
		        }  
		    });
		
	}

	@Override
	public List<Inmueble> obtenerListaHospitalesClinicas(BusquedaSencillaBean objBusquedaSencillaBean,final int offset, int resultadosPorPagina)
	{
		StringBuffer sb = new StringBuffer();
		
		final int tipoServicio = objBusquedaSencillaBean.getTipoServicio();

		sb.append(" SELECT inm_id,itijoin.uni_id,itijoin.uni_tipoinmuebleid ,uni_descripcion,uni_razonsocial,uni_rfc,inm_calle,inm_numeroexterior,inm_numerointerior,inm_referenciaubicacion,inm_referenciaubicacion2,inm_numerolocal,inm_estadoid,estados.est_descripcion,inm_municipioid,municipios.mun_descripcion,inm_codigopostal,inm_coloniadesc,inm_latitud,inm_longitud,uni_zoom,uni_tiposector,uni_giroid, paginaweb.pwe_descripcion, correoelectronico.cel_id , correoelectronico.cel_descripcion, telefonos.tel_id, telefonos.tel_telefono, telefonos.tel_lada,inm_banderaalta,inm_estatus,inm_fecalt,inm_fecact,inm_usualt,inm_fecmod,inm_usumod, uni_acercade , uni_verificado ");
		sb.append(" , especialidadinmueble.ein_especialidadid, especialidades.esp_descripcion ");
		sb.append(" , itijoin.uni_principal , itijoin.uni_tipoinmuebleid , itijoin.uni_emergencia , itijoin.uni_urgencia , itijoin.uni_24h, itijoin.uni_domicilio, itijoin.uni_formapago, itijoin.uni_promocionvigente   ");
		sb.append(" FROM inmuebles ");
		
		sb.append(" RIGHT JOIN  (select prin.uni_id, prin.uni_principal ,prin.uni_inmuebleid, prin.uni_tipoinmuebleid, prin.uni_emergencia, prin.uni_urgencia, prin.uni_24h, prin.uni_domicilio, prin.uni_formapago, prin.uni_promocionvigente, prin.uni_descripcion, prin.uni_razonsocial, prin.uni_rfc, prin.uni_zoom, prin.uni_tiposector, prin.uni_giroid, prin.uni_autocomplete,prin.uni_acercade,prin.uni_franquicia,prin.uni_verificado   FROM unidadnegocio as prin ");
		sb.append(" inner join (");
		sb.append(" select uni_inmuebleid FROM unidadnegocio where uni_tipoinmuebleid = ? ");
		sb.append(" ) as sec on prin.uni_inmuebleid = sec.uni_inmuebleid ");
		sb.append(" inner join inmuebles as inmb ");
		sb.append(" on (prin.uni_inmuebleid = inmb.inm_id and inmb.inm_estadoid = ? and inmb.inm_municipioid = ? and prin.uni_descripcion LIKE ? ) ");
		sb.append(" limit ? offset ? ");
		sb.append(" ) AS itijoin  ON inmuebles.inm_id = itijoin.uni_inmuebleid ");
		
		sb.append(" INNER JOIN ");
		sb.append(" estados ");
		sb.append(" ON inmuebles.inm_estadoid = estados.est_id ");
		sb.append(" INNER JOIN ");
		sb.append(" municipios ");
		sb.append(" ON municipios.mun_estadoid = inmuebles.inm_estadoid AND inmuebles.inm_municipioid = municipios.mun_idmunicipioSepomex ");
		
		sb.append(" LEFT JOIN especialidadinmueble ");
		sb.append(" ON especialidadinmueble.ein_unidadnegocioid = inmuebles.inm_id ");
		sb.append(" LEFT JOIN especialidades ");
		sb.append(" ON especialidades.esp_id = especialidadinmueble.ein_especialidadid ");
		
		sb.append(" LEFT JOIN telefonos ");
		sb.append(" ON telefonos.tel_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN paginaweb ");
		sb.append(" ON paginaweb.pwe_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN correoelectronico ");
		sb.append(" ON correoelectronico.cel_unidadnegocioid = inmuebles.inm_id ");
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			objBusquedaSencillaBean.getTipoServicio(), 
			objBusquedaSencillaBean.getIdEstado(),
			objBusquedaSencillaBean.getIdMunicipio()
			,"%"+objBusquedaSencillaBean.getDescripcion()+"%"
			, resultadosPorPagina
			, offset
		},
				new ResultSetExtractor<List<Inmueble>>(){  
		    @Override  
		     public List<Inmueble> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	Map<Long, Inmueble> mapInmuebles = new LinkedHashMap<Long, Inmueble>();
		    	Map<Long, Telefono> mapTelefono = new LinkedHashMap<Long, Telefono>();
		    	Map<Long, CorreoElectronico> mapCorreo = new LinkedHashMap<Long, CorreoElectronico>();
		    	
		    	int pagina = (1 * ((offset/10) + 1));

		    	int	indice = ( ( pagina - 1 ) * 10 ) + 1;
		    	
		        while(rs.next()){
		        	Long id = rs.getLong("inm_id");
		        	Inmueble objInmueble = mapInmuebles.get(id);
		        	
		        	if(objInmueble == null)
		        	{
		        		objInmueble = new Inmueble();
		        		objInmueble.setIndice(indice);
		        		
		        		Estado objEstado = new Estado();
						objEstado.setEst_id(rs.getInt("inm_estadoid"));
						objEstado.setEst_descripcion(rs.getString("estados.est_descripcion"));
		
						Municipio objMunicipio = new Municipio();
						objMunicipio.setMun_id(rs.getInt("inm_municipioid"));
						objMunicipio.setMun_descripcion(rs.getString("municipios.mun_descripcion"));
						objMunicipio.setObjEstado(objEstado);
						
						UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
	        			obj.setDomicilio(rs.getBoolean("uni_domicilio"));
	        			
	        			//Llenar datos de forma de pago y vigencia de promocion
	        			obj.setFormaPago(rs.getInt("uni_formapago"));
	        			obj.setPromocionVigente(rs.getBoolean("uni_promocionvigente"));
	        			
						obj.setDescripcion(rs.getString("uni_descripcion"));
						obj.setRazonSocial(rs.getString("uni_razonsocial"));
						obj.setRfc(rs.getString("uni_rfc"));
						obj.setZoom(rs.getString("uni_zoom"));
						obj.setTipoSector(rs.getString("uni_tiposector"));
						obj.setGiroId(rs.getString("uni_giroid"));
						obj.setAcercaDe(rs.getString("uni_acercade"));
						obj.setVerificado(rs.getBoolean("uni_verificado"));
	        			
	        			objInmueble.setObjUnidadNegocio(obj);
		
						objInmueble.setId(rs.getInt("inm_id"));
		
						objInmueble.setCalle(rs.getString("inm_calle"));
						objInmueble.setNumeroExterior(rs.getString("inm_numeroexterior"));
						objInmueble.setNumeroInterior(rs.getString("inm_numerointerior"));
						objInmueble.setReferenciaUbicacion(rs.getString("inm_referenciaubicacion"));
						objInmueble.setReferenciaUbicacion2(rs.getString("inm_referenciaubicacion2"));
						objInmueble.setNumeroLocal(rs.getString("inm_numerolocal"));
		
						objInmueble.getEstado().setEst_id(objEstado.getEst_id());
						objInmueble.getEstado().setEst_descripcion(objEstado.getEst_descripcion());
		
						objInmueble.getMunicipio().setMun_id(objMunicipio.getMun_id());
						objInmueble.getMunicipio().setMun_descripcion(objMunicipio.getMun_descripcion());
						
						PaginaWeb objPaginaWeb = new PaginaWeb();
	        			objPaginaWeb.setDescripcion(rs.getString("paginaweb.pwe_descripcion"));
	        			objInmueble.setObjPaginaWeb(objPaginaWeb);
		
						objInmueble.setCodigoPostal(rs.getString("inm_codigopostal"));
						objInmueble.setColoniaDescripcion(rs.getString("inm_coloniadesc"));
						objInmueble.setLatitud(rs.getString("inm_latitud"));
						objInmueble.setLongitud(rs.getString("inm_longitud"));

						objInmueble.setBanderaAlta(rs.getInt("inm_banderaalta"));

						objInmueble.setEstatus(rs.getInt("inm_estatus"));
						objInmueble.setFecAlt(rs.getString("inm_fecalt"));
						objInmueble.setFecAct(rs.getString("inm_fecact"));
						objInmueble.setUsuAlt(rs.getInt("inm_usualt"));
						objInmueble.setFecMod(rs.getString("inm_fecmod"));
						objInmueble.setUsuMod(rs.getInt("inm_usumod"));

						//Se agrega al map
						mapInmuebles.put(id, objInmueble);
						
						indice++;
		        		
		        	}
		        	
		        	if(tipoServicio != rs.getInt("uni_tipoinmuebleid"))
		        	{//Si es un tipo inmueble diferente al buscado, se agrega a la lista.
	        			UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
		        		objInmueble.getLstInmuebleTipoInmueble().add(obj);
		        	}else{
		        		//El registro pertenece a la misma unidad de negocio
		        		
		        		//Condicion, ya que actualmente no tenemos ningun inmueble con especialidades
			        	if(rs.getInt("especialidadinmueble.ein_especialidadid") != 0)
			        	{
			        		Especialidad objEspecialidad = new Especialidad();
							objEspecialidad.setId(rs.getInt("especialidadinmueble.ein_especialidadid"));
							objEspecialidad.setNombre(rs.getString("especialidades.esp_descripcion"));
				        	
				        	objInmueble.getLstEspecialidades().add(objEspecialidad);
			        	}
			        	
			        	Long idTelefono = rs.getLong("telefonos.tel_id");
			        	Telefono objTelefono = mapTelefono.get(idTelefono);
			        	
			        	if(objTelefono == null)
			        	{//No existe en lista de telefonos
			        		Telefono objTelefonoLocal = new Telefono();
			        		objTelefonoLocal.setId(rs.getInt("telefonos.tel_id"));
			        		objTelefonoLocal.setTelefono(rs.getString("telefonos.tel_telefono"));
			        		objTelefonoLocal.setLada(rs.getString("telefonos.tel_lada"));
			        		mapTelefono.put(idTelefono, objTelefonoLocal);//Se agrega al map.
			        		objInmueble.getLstTelefono().add(objTelefonoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
			        	
			        	Long idCorreo = rs.getLong("correoelectronico.cel_id");
			        	CorreoElectronico objCorreo = mapCorreo.get(idCorreo);
			        	
			        	if(objCorreo == null)
			        	{//No existe en lista de correos
			        		CorreoElectronico objCorreoElectronicoLocal = new CorreoElectronico();
			        		objCorreoElectronicoLocal.setId(rs.getInt("correoelectronico.cel_id"));
			        		objCorreoElectronicoLocal.setDescripcion(rs.getString("correoelectronico.cel_descripcion"));
			        		mapCorreo.put(idTelefono, objCorreoElectronicoLocal);//Se agrega al map.
			        		objInmueble.getLstCorreoElectronico().add(objCorreoElectronicoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
		        		
		        	
		        	}

		        }
		        	return new ArrayList<Inmueble>(mapInmuebles.values()); 
		        }  
		    });
	}

	@Override
	public List<Inmueble> obtenerListaConsultorios(BusquedaAvanzadaBean objBusquedaAvanzadaBean)
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Inmueble> obtenerListaFarmacias(BusquedaAvanzadaBean objBusquedaAvanzadaBean)
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Inmueble> obtenerListaLaboratorios(BusquedaAvanzadaBean objBusquedaAvanzadaBean)
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Inmueble> obtenerListaHospitalesClinicas(BusquedaAvanzadaBean objBusquedaAvanzadaBean)
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int obtenerTotalRegistros(BusquedaSencillaBean objBusquedaSencillaBean)
	{

		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT COUNT(*) as total ");
		sb.append(" FROM inmuebles ");
		
		sb.append(" RIGHT JOIN  (select prin.uni_id, prin.uni_principal ,prin.uni_inmuebleid, prin.uni_tipoinmuebleid, prin.uni_emergencia, prin.uni_urgencia, prin.uni_24h, prin.uni_domicilio, prin.uni_formapago, prin.uni_promocionvigente  FROM unidadnegocio as prin ");
		sb.append(" inner join (");
		sb.append(" select uni_inmuebleid FROM unidadnegocio where uni_tipoinmuebleid = ? ");
		sb.append(" ) as sec on prin.uni_inmuebleid = sec.uni_inmuebleid ");
		sb.append(" inner join inmuebles as inmb ");
		sb.append(" on (prin.uni_inmuebleid = inmb.inm_id and inmb.inm_estadoid = ? and inmb.inm_municipioid = ? and prin.uni_descripcion LIKE ? ) ");
		sb.append(" ) AS itijoin  ON inmuebles.inm_id = itijoin.uni_inmuebleid ");
		

		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			objBusquedaSencillaBean.getTipoServicio(), 
			objBusquedaSencillaBean.getIdEstado(),
			objBusquedaSencillaBean.getIdMunicipio()
			,"%"+objBusquedaSencillaBean.getDescripcion()+"%"
		},
				new ResultSetExtractor<Integer>(){  
		    @Override  
		     public Integer extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  

		    	int total = 0;

		        if(rs.next()){
		        	total = rs.getInt("total");
		        }
		        	return total; 
		        }  
		    });
	}
		
	public  List<Inmueble> obtenerListaConsultoriosGeolocalizacion(BusquedaGeolocalizacionBean objBusquedaGeolocalizacion,final int offset, int resultadosPorPagina){
		

		final int tipoServicio = objBusquedaGeolocalizacion.getUnidadNegocio();
		
		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT inm_id,itijoin.uni_id,itijoin.uni_tipoinmuebleid ,uni_descripcion,uni_razonsocial,uni_rfc,inm_calle,inm_numeroexterior,inm_numerointerior,inm_referenciaubicacion,inm_referenciaubicacion2,inm_numerolocal,inm_estadoid,estados.est_descripcion,inm_municipioid,municipios.mun_descripcion,inm_codigopostal,inm_coloniadesc,inm_latitud,inm_longitud,uni_zoom,uni_tiposector,uni_giroid, paginaweb.pwe_descripcion, correoelectronico.cel_id , correoelectronico.cel_descripcion, telefonos.tel_id, telefonos.tel_telefono, telefonos.tel_lada,inm_banderaalta,inm_estatus,inm_fecalt,inm_fecact,inm_usualt,inm_fecmod,inm_usumod, uni_acercade, uni_verificado ");
		sb.append(" , especialidadinmueble.ein_especialidadid, especialidades.esp_descripcion ");
		sb.append(" , itijoin.uni_principal , itijoin.uni_tipoinmuebleid , itijoin.uni_emergencia , itijoin.uni_urgencia , itijoin.uni_24h, itijoin.uni_domicilio, itijoin.uni_formapago, itijoin.uni_promocionvigente ");
		
		sb.append(" FROM inmuebles ");
		
		sb.append(" RIGHT JOIN  (select prin.uni_id, prin.uni_principal ,prin.uni_inmuebleid, prin.uni_tipoinmuebleid, prin.uni_emergencia, prin.uni_urgencia, prin.uni_24h, prin.uni_domicilio, prin.uni_formapago, prin.uni_promocionvigente, prin.uni_descripcion, prin.uni_razonsocial, prin.uni_rfc, prin.uni_zoom, prin.uni_tiposector, prin.uni_giroid, prin.uni_autocomplete,prin.uni_acercade,prin.uni_franquicia,prin.uni_verificado  ");
		sb.append(", ( 6371 * acos( cos( radians( ? ) ) * cos( radians( inmb.inm_latitud ) ) * cos( radians( inmb.inm_longitud ) - radians( ? ) ) + sin( radians( ? ) )  * sin( radians( inmb.inm_latitud ) ) )) AS distance ");
		sb.append("FROM unidadnegocio as prin ");
		
		
		sb.append(" inner join (");
		sb.append(" select uni_inmuebleid FROM unidadnegocio where uni_tipoinmuebleid = ? ");
		sb.append(" ) as sec on prin.uni_inmuebleid = sec.uni_inmuebleid ");
		sb.append(" inner join inmuebles as inmb ");
		sb.append(" on (prin.uni_inmuebleid = inmb.inm_id and prin.uni_descripcion LIKE ? ) ");
		
		sb.append(" HAVING distance < 3 ORDER BY distance ");
		
		sb.append(" limit ? offset ? ");
		sb.append(" ) AS itijoin  ON inmuebles.inm_id = itijoin.uni_inmuebleid ");
		
		sb.append(" INNER JOIN ");
		sb.append(" estados ");
		sb.append(" ON inmuebles.inm_estadoid = estados.est_id ");
		sb.append(" INNER JOIN ");
		sb.append(" municipios ");
		sb.append(" ON municipios.mun_estadoid = inmuebles.inm_estadoid AND inmuebles.inm_municipioid = municipios.mun_idmunicipioSepomex ");
		
		sb.append(" LEFT JOIN especialidadinmueble ");
		sb.append(" ON especialidadinmueble.ein_unidadnegocioid = inmuebles.inm_id ");
		sb.append(" LEFT JOIN especialidades ");
		sb.append(" ON especialidades.esp_id = especialidadinmueble.ein_especialidadid ");
		
		sb.append(" LEFT JOIN telefonos ");
		sb.append(" ON telefonos.tel_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN paginaweb ");
		sb.append(" ON paginaweb.pwe_unidadnegocioid = inmuebles.inm_id ");
		
		sb.append(" LEFT JOIN correoelectronico ");
		sb.append(" ON correoelectronico.cel_unidadnegocioid = inmuebles.inm_id ");
		
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			
			objBusquedaGeolocalizacion.getLatitud(),
			objBusquedaGeolocalizacion.getLongitud()
			,objBusquedaGeolocalizacion.getLatitud()
			,objBusquedaGeolocalizacion.getUnidadNegocio()
			,"%"+objBusquedaGeolocalizacion.getDescripcion()+"%"
			, resultadosPorPagina
			, offset//offset
		},
				new ResultSetExtractor<List<Inmueble>>(){  
		    @Override  
		     public List<Inmueble> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	Map<Long, Inmueble> mapInmuebles = new LinkedHashMap<Long, Inmueble>();
		    	Map<Long, Telefono> mapTelefono = new LinkedHashMap<Long, Telefono>();
		    	Map<Long, CorreoElectronico> mapCorreo = new LinkedHashMap<Long, CorreoElectronico>();
		    	
		    	int pagina = (1 * ((offset/10) + 1));

		    	int	indice = ( ( pagina - 1 ) * 10 ) + 1;
 
		        while(rs.next()){
		        	Long id = rs.getLong("inm_id");
		        	Inmueble objInmueble = mapInmuebles.get(id);
		        	
		        	if(objInmueble == null)
		        	{
		        		objInmueble = new Inmueble();
		        		objInmueble.setIndice(indice);
		        		
		        		Estado objEstado = new Estado();
						objEstado.setEst_id(rs.getInt("inm_estadoid"));
						objEstado.setEst_descripcion(rs.getString("estados.est_descripcion"));
		
						Municipio objMunicipio = new Municipio();
						objMunicipio.setMun_id(rs.getInt("inm_municipioid"));
						objMunicipio.setMun_descripcion(rs.getString("municipios.mun_descripcion"));
						objMunicipio.setObjEstado(objEstado);
						
						UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			PaginaWeb objPaginaWeb = new PaginaWeb();
	        			objPaginaWeb.setDescripcion(rs.getString("paginaweb.pwe_descripcion"));
	        			objInmueble.setObjPaginaWeb(objPaginaWeb);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
	        			obj.setDomicilio(rs.getBoolean("uni_domicilio"));
	        			
	        			//Llenar datos de forma de pago y vigencia de promocion
	        			obj.setFormaPago(rs.getInt("uni_formapago"));
	        			obj.setPromocionVigente(rs.getBoolean("uni_promocionvigente"));
	        			
						obj.setDescripcion(rs.getString("uni_descripcion"));
						obj.setRazonSocial(rs.getString("uni_razonsocial"));
						obj.setRfc(rs.getString("uni_rfc"));
						obj.setZoom(rs.getString("uni_zoom"));
						obj.setTipoSector(rs.getString("uni_tiposector"));
						obj.setGiroId(rs.getString("uni_giroid"));
						obj.setAcercaDe(rs.getString("uni_acercade"));
						obj.setVerificado(rs.getBoolean("uni_verificado"));
	        			
	        			objInmueble.setObjUnidadNegocio(obj);

						objInmueble.setId(rs.getInt("inm_id"));
		
						objInmueble.setCalle(rs.getString("inm_calle"));
						objInmueble.setNumeroExterior(rs.getString("inm_numeroexterior"));
						objInmueble.setNumeroInterior(rs.getString("inm_numerointerior"));
						objInmueble.setReferenciaUbicacion(rs.getString("inm_referenciaubicacion"));
						objInmueble.setReferenciaUbicacion2(rs.getString("inm_referenciaubicacion2"));
						objInmueble.setNumeroLocal(rs.getString("inm_numerolocal"));
		
						objInmueble.getEstado().setEst_id(objEstado.getEst_id());
						objInmueble.getEstado().setEst_descripcion(objEstado.getEst_descripcion());
		
						objInmueble.getMunicipio().setMun_id(objMunicipio.getMun_id());
						objInmueble.getMunicipio().setMun_descripcion(objMunicipio.getMun_descripcion());
		
						objInmueble.setCodigoPostal(rs.getString("inm_codigopostal"));
						objInmueble.setColoniaDescripcion(rs.getString("inm_coloniadesc"));
						objInmueble.setLatitud(rs.getString("inm_latitud"));
						objInmueble.setLongitud(rs.getString("inm_longitud"));

						objInmueble.setBanderaAlta(rs.getInt("inm_banderaalta"));

						objInmueble.setEstatus(rs.getInt("inm_estatus"));
						objInmueble.setFecAlt(rs.getString("inm_fecalt"));
						objInmueble.setFecAct(rs.getString("inm_fecact"));
						objInmueble.setUsuAlt(rs.getInt("inm_usualt"));
						objInmueble.setFecMod(rs.getString("inm_fecmod"));
						objInmueble.setUsuMod(rs.getInt("inm_usumod"));
						
						//Se agrega al map
						mapInmuebles.put(id, objInmueble);
						
						indice++;
		        		
		        	}
		        		
	        		if(tipoServicio != rs.getInt("uni_tipoinmuebleid"))
		        	{//Si es un tipo inmueble diferente al buscado, se agrega a la lista.
	        			UnidadNegocio obj = new UnidadNegocio();
	        			obj.setId(rs.getInt("uni_id"));
	        			obj.setHrs24(rs.getBoolean("uni_24h"));
	        			obj.setInmuebleId(rs.getInt("inm_id"));
	        			obj.setPrincipal(rs.getBoolean("uni_principal"));
	        			
	        			TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			obj.setObjTipoInmueble(objTipoInmueble);
	        			
	        			obj.setUrgencia(rs.getBoolean("uni_urgencia"));
	        			obj.setEmergencia(rs.getBoolean("uni_emergencia"));
		        		objInmueble.getLstInmuebleTipoInmueble().add(obj);
		        	}else{
		        		//El registro pertenece a la misma unidad de negocio
		        		
		        		//Condicion, ya que actualmente no tenemos ningun inmueble con especialidades
			        	if(rs.getInt("especialidadinmueble.ein_especialidadid") != 0)
			        	{
			        		Especialidad objEspecialidad = new Especialidad();
							objEspecialidad.setId(rs.getInt("especialidadinmueble.ein_especialidadid"));
							objEspecialidad.setNombre(rs.getString("especialidades.esp_descripcion"));
				        	
				        	objInmueble.getLstEspecialidades().add(objEspecialidad);
			        	}
			        	
			        	Long idTelefono = rs.getLong("telefonos.tel_id");
			        	Telefono objTelefono = mapTelefono.get(idTelefono);
			        	
			        	if(objTelefono == null)
			        	{//No existe en lista de telefonos
			        		Telefono objTelefonoLocal = new Telefono();
			        		objTelefonoLocal.setId(rs.getInt("telefonos.tel_id"));
			        		objTelefonoLocal.setTelefono(rs.getString("telefonos.tel_telefono"));
			        		objTelefonoLocal.setLada(rs.getString("telefonos.tel_lada"));
			        		mapTelefono.put(idTelefono, objTelefonoLocal);//Se agrega al map.
			        		objInmueble.getLstTelefono().add(objTelefonoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
			        	
			        	Long idCorreo = rs.getLong("correoelectronico.cel_id");
			        	CorreoElectronico objCorreo = mapCorreo.get(idCorreo);
			        	
			        	if(objCorreo == null)
			        	{//No existe en lista de correos
			        		CorreoElectronico objCorreoElectronicoLocal = new CorreoElectronico();
			        		objCorreoElectronicoLocal.setId(rs.getInt("correoelectronico.cel_id"));
			        		objCorreoElectronicoLocal.setDescripcion(rs.getString("correoelectronico.cel_descripcion"));
			        		mapCorreo.put(idTelefono, objCorreoElectronicoLocal);//Se agrega al map.
			        		objInmueble.getLstCorreoElectronico().add(objCorreoElectronicoLocal);//Se agrega a la lista de telefonos del inmueble.
			        	}
			        	
			        	
		        		
		        	}
		        		

		        }
		        	return new ArrayList<Inmueble>(mapInmuebles.values()); 
		        }  
		    });
		
	
		
	}
	
	@Override
	public int obtenerTotalRegistros(BusquedaGeolocalizacionBean objBusquedaGeolocalizacionBean)
	{

		StringBuffer sb = new StringBuffer();

		sb.append(" select count(distance) as total from ( ");
		
		sb.append(" select ( 6371 * acos( cos( radians( ? ) ) * cos( radians( inm_latitud ) ) * cos( radians( inm_longitud ) ");
		sb.append(" - radians( ? ) ) + sin( radians( ? ) )  * sin( radians( inm_latitud ) ) )) AS distance  ");
		sb.append(" from inmuebles inner join unidadnegocio ");
		sb.append(" on (inmuebles.inm_id = unidadnegocio.uni_inmuebleid ");
		sb.append(" and unidadnegocio.uni_tipoinmuebleid = ? and unidadnegocio.uni_descripcion LIKE ?) ");
		sb.append(" HAVING distance <= 3 ");
		sb.append("  ");
		sb.append(" ) as tablaTotal ");

		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			objBusquedaGeolocalizacionBean.getLatitud(),
			objBusquedaGeolocalizacionBean.getLongitud()
			,objBusquedaGeolocalizacionBean.getLatitud()
			,objBusquedaGeolocalizacionBean.getUnidadNegocio()
			,"%"+objBusquedaGeolocalizacionBean.getDescripcion()+"%"
		},
				new ResultSetExtractor<Integer>(){  
		    @Override  
		     public Integer extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  

		    	int total = 0;

		        if(rs.next()){
		        	total = rs.getInt("total");
		        }
		        	return total; 
		        }  
		    });
	}


	@Override
	public List<HorarioInmueble> detalleHorario(int inmuebleTipoInmuebleId)
	{
		
		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT ");
		sb.append(" hin_id,hin_unidadnegocioid, TIME_FORMAT(hin_horainicio,'%H:%i') as hin_horainicio, TIME_FORMAT(hin_horafinal,'%H:%i') as hin_horafinal, hin_diaid ");
		
		sb.append(" ,catdias.dia_id,catdias.dia_descripcion,catdias.dia_abreviado,catdias.dia_letra ");
		
		sb.append(" FROM ");
		sb.append(" horarioinmueble ");
		
		sb.append(" INNER JOIN ");
		sb.append(" catdias ");
		sb.append(" ON catdias.dia_id = horarioinmueble.hin_diaid ");
		
		sb.append(" WHERE ");
		sb.append(" hin_unidadnegocioid = ");
		sb.append(" ? ");
		sb.append(" GROUP BY hin_diaid,hin_horainicio,hin_horafinal ");
		
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			inmuebleTipoInmuebleId
		},
				new ResultSetExtractor<List<HorarioInmueble>>(){  
		    @Override  
		     public List<HorarioInmueble> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	ArrayList<HorarioInmueble> lstHorarioInmueble = new ArrayList<HorarioInmueble>();
 
		        while(rs.next()){
		        	HorarioInmueble objHorarioInmueble = new HorarioInmueble();
		        	UnidadNegocio objInmuebleTipoInmueble = new UnidadNegocio();
		        	
		        	objHorarioInmueble.setId(rs.getInt("hin_id"));
		        	objHorarioInmueble.setHoraInicio(rs.getString("hin_horainicio"));
		        	objHorarioInmueble.setHoraFinal(rs.getString("hin_horafinal"));
		        	
		        	objInmuebleTipoInmueble.setId(rs.getInt("hin_unidadnegocioid"));
		        	objHorarioInmueble.setObjInmuebleTipoInmueble(objInmuebleTipoInmueble);
		        	
		        	Dia objDia = new Dia();
		        	objDia.setId(rs.getInt("catdias.dia_id"));
		        	objDia.setDescripcion(rs.getString("catdias.dia_descripcion"));
		        	objDia.setAbreviado(rs.getString("catdias.dia_abreviado"));
		        	objDia.setLetra(rs.getString("catdias.dia_letra"));
		        	
		        	objHorarioInmueble.setObjDia(objDia);
		        	
		        	lstHorarioInmueble.add(objHorarioInmueble);
		        }
		        	return lstHorarioInmueble; 
		        }  
		    });
		
	}

	@Override
	public Inmueble detalleInmueble(int inmuebleId, final int tipoInmuebleId)
	{
		
		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT ");
		
		sb.append(" uni_id, uni_inmuebleid, uni_tipoinmuebleid, uni_principal, uni_domicilio, uni_emergencia, uni_urgencia, uni_24h, ");
		
		sb.append(" uni_descripcion, uni_razonsocial, uni_rfc, uni_acercade, inm_calle, inm_numeroexterior, inm_numerointerior, inm_referenciaubicacion, inm_referenciaubicacion2, inm_numerolocal, inm_estadoid, inm_municipioid, inm_codigopostal, inm_coloniadesc, inm_latitud, inm_longitud, uni_zoom, uni_tiposector, ");
		
		sb.append("  estados.est_descripcion, municipios.mun_descripcion ");
		
		sb.append(" FROM  ");
		sb.append(" unidadnegocio ");
		sb.append(" LEFT JOIN inmuebles ");
		sb.append(" ON unidadnegocio.uni_inmuebleid = inmuebles.inm_id ");
		sb.append(" INNER JOIN estados ");
		sb.append(" ON estados.est_id = inmuebles.inm_estadoid ");
		sb.append(" INNER JOIN municipios ");
		sb.append(" ON (municipios.mun_idmunicipioSepomex = inmuebles.inm_municipioid AND inmuebles.inm_estadoid = municipios.mun_estadoid) ");
		sb.append(" WHERE inmuebles.inm_id = ");
		sb.append(" ? ");
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			inmuebleId
		},
				new ResultSetExtractor<Inmueble>(){ 
			
		    @Override  
		     public Inmueble extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  

		    	Inmueble objInmueble = new Inmueble();
		    	
		        while(rs.next()){
		        	
		        	if(rs.getInt("uni_tipoinmuebleid") == tipoInmuebleId)
		        	{
		        		//Obtener direccion
		        		objInmueble.setId(rs.getInt("uni_inmuebleid"));		        		
		        		
		        		UnidadNegocio objInmuebleTipoInmueble = new UnidadNegocio();
		        		objInmuebleTipoInmueble.setId(rs.getInt("uni_id"));
		        		objInmuebleTipoInmueble.setInmuebleId(rs.getInt("uni_inmuebleid"));		        		
		        		objInmuebleTipoInmueble.setPrincipal(rs.getBoolean("uni_principal"));
		        		objInmuebleTipoInmueble.setDomicilio(rs.getBoolean("uni_domicilio"));
		        		objInmuebleTipoInmueble.setEmergencia(rs.getBoolean("uni_emergencia"));
		        		objInmuebleTipoInmueble.setUrgencia(rs.getBoolean("uni_urgencia"));
		        		objInmuebleTipoInmueble.setHrs24(rs.getBoolean("uni_24h"));
		        		
		        		objInmuebleTipoInmueble.setDescripcion(rs.getString("uni_descripcion"));
		        		objInmuebleTipoInmueble.setRazonSocial(rs.getString("uni_razonsocial"));
		        		objInmuebleTipoInmueble.setRfc(rs.getString("uni_rfc"));
		        		objInmuebleTipoInmueble.setZoom(rs.getString("uni_zoom"));
		        		objInmuebleTipoInmueble.setTipoSector(rs.getString("uni_tiposector"));
		        		objInmuebleTipoInmueble.setAcercaDe(rs.getString("uni_acercade"));
		        		
		        		TipoInmueble objTipoInmueble = new TipoInmueble();
	        			objTipoInmueble.setTin_id(rs.getInt("uni_tipoinmuebleid"));
	        			objInmuebleTipoInmueble.setObjTipoInmueble(objTipoInmueble);
	        			
	        			objInmueble.setObjUnidadNegocio(objInmuebleTipoInmueble);
	        			
		        		objInmueble.setCalle(rs.getString("inm_calle"));
		        		objInmueble.setNumeroExterior(rs.getString("inm_numeroexterior"));
		        		objInmueble.setNumeroInterior(rs.getString("inm_numerointerior"));
		        		objInmueble.setReferenciaUbicacion(rs.getString("inm_referenciaubicacion"));
		        		objInmueble.setReferenciaUbicacion2(rs.getString("inm_referenciaubicacion2"));
		        		objInmueble.setNumeroLocal(rs.getString("inm_numerolocal"));
		        		
		        		Estado objEstado = new Estado();
		        		objEstado.setEst_id(rs.getInt("inm_estadoid"));
		        		objEstado.setEst_descripcion(rs.getString("estados.est_descripcion"));
		        		objInmueble.setEstado(objEstado);
		        		
		        		Municipio objMunicipio = new Municipio();
		        		objMunicipio.setMun_idmunicipioSepomex(rs.getInt("inm_municipioid"));
		        		objMunicipio.setMun_descripcion(rs.getString("municipios.mun_descripcion"));
		        		objInmueble.setMunicipio(objMunicipio);
		        		
		        		objInmueble.setColoniaDescripcion(rs.getString("inm_coloniadesc"));
		        		objInmueble.setCodigoPostal(rs.getString("inm_codigopostal"));
		        		
		        		objInmueble.setLatitud(rs.getString("inm_latitud"));
		        		objInmueble.setLongitud(rs.getString("inm_longitud"));

		        				        		
		        	}else{
		        		UnidadNegocio objInmuebleTipoInmueble = new UnidadNegocio();
		        		//Agregar a lista de servicios adicionales
		        		objInmuebleTipoInmueble.setId(rs.getInt("uni_id"));
		        		objInmuebleTipoInmueble.getObjTipoInmueble().setTin_id(rs.getInt("uni_tipoinmuebleid"));
		        		objInmueble.getLstInmuebleTipoInmueble().add(objInmuebleTipoInmueble);
		        		
		        	}
		        	
		        }
		        
		        	return objInmueble; 
		        }  
		    });
		
		
	}

	@Override
	public List<Telefono> detalleTelefonos(int inmuebleTipoInmuebleId)
	{
		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT ");
		sb.append(" tel_id, tel_unidadnegocioid, tel_areaId, tel_lada, tel_telefono, tel_clave, tel_tipodispositivo ");
		sb.append(" FROM ");
		sb.append(" telefonos ");
		sb.append(" WHERE ");
		sb.append(" telefonos.tel_unidadnegocioid = ");
		sb.append(" ? ");
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			inmuebleTipoInmuebleId
		},
				new ResultSetExtractor<List<Telefono>>(){  
		    @Override  
		     public List<Telefono> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	ArrayList<Telefono> lstTelefono = new ArrayList<Telefono>();
 
		        while(rs.next()){
		        	Telefono objTelefono = new Telefono();
		        	
		        	objTelefono.setId(rs.getInt("tel_id"));
		        	
		        	UnidadNegocio objInmuebleTipoInmueble = new UnidadNegocio();
		        	objInmuebleTipoInmueble.setId(rs.getInt("tel_unidadnegocioid"));
		        	objTelefono.setObjInmuebleTipoInmueble(objInmuebleTipoInmueble);
		        	
		        	AreaInmueble objAreaInmueble = new AreaInmueble();
		        	objAreaInmueble.setId(rs.getInt("tel_areaId"));
		        	objTelefono.setObjAreaInmueble(objAreaInmueble);
		        	
		        	objTelefono.setLada(rs.getString("tel_lada"));
		        	objTelefono.setTelefono(rs.getString("tel_telefono"));
		        	objTelefono.setClave(rs.getString("tel_clave"));
		        	objTelefono.setTipoDispositivo(rs.getInt("tel_tipodispositivo"));
		        	
		        	lstTelefono.add(objTelefono);
		        }
		        	return lstTelefono; 
		        }  
		    });
	}
	
	public List<ServicioInmueble> listaServiciosInmueble(int inmuebleTipoInmuebleId){
		
		StringBuffer sb = new StringBuffer();

		sb.append(" SELECT ");
		sb.append(" tel_id, tel_unidadnegocioid, tel_areaId, tel_lada, tel_telefono, tel_clave, tel_tipodispositivo ");
		sb.append(" FROM ");
		sb.append(" telefonos ");
		sb.append(" WHERE ");
		sb.append(" telefonos.tel_unidadnegocioid = ");
		sb.append(" ? ");
		
		return getJdbcTemplate().query(sb.toString(),
				new Object[] { 
			inmuebleTipoInmuebleId
		},
				new ResultSetExtractor<List<ServicioInmueble>>(){  
		    @Override  
		     public List<ServicioInmueble> extractData(ResultSet rs) throws SQLException,  
		            DataAccessException {  
		      
		    	ArrayList<ServicioInmueble> lstTelefono = new ArrayList<ServicioInmueble>();
 
		        while(rs.next()){
		        	Telefono objTelefono = new Telefono();
		        	
		        	objTelefono.setId(rs.getInt("tel_id"));
		        	
		        	UnidadNegocio objInmuebleTipoInmueble = new UnidadNegocio();
		        	objInmuebleTipoInmueble.setId(rs.getInt("tel_unidadnegocioid"));
		        	objTelefono.setObjInmuebleTipoInmueble(objInmuebleTipoInmueble);
		        	
		        	AreaInmueble objAreaInmueble = new AreaInmueble();
		        	objAreaInmueble.setId(rs.getInt("tel_areaId"));
		        	objTelefono.setObjAreaInmueble(objAreaInmueble);
		        	
		        	objTelefono.setLada(rs.getString("tel_lada"));
		        	objTelefono.setTelefono(rs.getString("tel_telefono"));
		        	objTelefono.setClave(rs.getString("tel_clave"));
		        	objTelefono.setTipoDispositivo(rs.getInt("tel_tipodispositivo"));
		        	
		        	//lstTelefono.add(objTelefono);
		        }
		        	return lstTelefono; 
		        }  
		    });
		
	}

}
